home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok59.lha / AmokEd_V1.02b / txt / ApplDemo.mod < prev    next >
Text File  |  1993-08-15  |  10KB  |  373 lines

  1. (*(***********************************************************************
  2.  
  3. :Program.    ApplDemo.mod
  4. :Contents.   AmokEd Applications-Demo
  5. :Author.     Hartmut Goebel [hG]
  6. :Language.   Oberon
  7. :Translator. Amiga Oberon V2.00
  8. :Imports.    Printf (Volker Rudolph)
  9. :History.    V1.0 09 Mar 1991 Hartmut Goebel
  10. :History.    V1.1 14 Jul 1991 [hG] +Test für XPingPong
  11. :History.    V1.2 12 Oct 1991 [hG] AEd0 und AEd1-Typen sind jetzt drin
  12. :Date.       19 Oct 1991 03:35:57
  13.  
  14. :Remark.     Jetzt mit besserer Dokumentation!
  15. :Usage.      AEd: execute (run appldemo $rexxport)
  16.  
  17. ***********************************************************************)*)
  18.  
  19. (*
  20.  * Dient als Beipiel für eine AmokEd-Applikation und zum Testen der
  21.  * AEdAppl-Befehle.
  22.  * Alles, was kein AEdAppl-Befehl ist, wird mit dem title-Befehl in
  23.  * Titel des Editors angezeigt.
  24.  *
  25.  * Dieses Programm hat noch viele kleine Unsauberheiten im Bereich
  26.  * des Port/Message-Handlings (PutMsg etc.), aber ich hatte keine Zeit
  27.  * und Lust mehr, sie alle zu bereinigen.
  28.  *
  29.  *)
  30.  
  31. MODULE ApplDemo;
  32.  
  33. IMPORT
  34.   Printf, io, NoGuru, Break,
  35.   arg: Arguments,
  36.   d  : Dos,
  37.   e  : Exec,
  38.   eAD: EdApplDefs,
  39.   lst: Lists,
  40.   ol : OberonLib,
  41.   req: Requests,
  42.   arx: ARexx,
  43.   rx : Rexx,
  44.   str: Strings,
  45.   sys: SYSTEM;
  46.  
  47. TYPE
  48.   String = ARRAY 256 OF CHAR;
  49.   StringPtr = POINTER TO String;
  50.   Host = RECORD (lst.Node)
  51.     name: StringPtr;
  52.   END;
  53.   HostPtr = POINTER TO Host;
  54.  
  55. CONST
  56.   ApplDemo = "ApplDemoPort";
  57.   CantCreateArgstring = "Can't Create Argstring\n";
  58.   NewText = "NewText";
  59.   numActivePings = 5;
  60.   Announce = "appladd ApplDemo ApplDemoPort";
  61.  
  62. VAR
  63.   MyPort: e.MsgPort;
  64.   Me: d.ProcessPtr;
  65.   rmptr: arx.RexxMsgPtr;
  66.   string: e.STRPTR;
  67.   test, PortAdded: BOOLEAN;
  68.   HisPortName: ARRAY 50 OF CHAR;  (* muß reichen *)
  69.   pingnum: INTEGER;
  70.   PingPongField: POINTER TO eAD.XPingPong;
  71.   HostList: lst.List;
  72.  
  73. (*
  74. PROCEDURE IsElement(VAR list: e.List; e: e.NodePtr): BOOLEAN;
  75. VAR
  76.   n: e.MinListPtr;
  77. BEGIN
  78.   n := list.head;
  79.   WHILE n.succ # NIL DO
  80.     IF e = n THEN RETURN TRUE; END;
  81.     n := n.succ;
  82.   END;
  83.   RETURN FALSE;
  84. END IsElement;
  85. *)
  86. (*
  87.  * doRexx schickt die Msg an den ZielPort
  88.  *
  89.  * Hier sind einige Parameter gegeben, die für diese Demo eigentlich
  90.  * unnötig sind. Z.B. <modifier> und <port>, da wir nur mit einem Port
  91.  * kommunizieren und immer die gleichen <modifier> mitgeben.
  92.  *
  93.  *)
  94.  
  95. PROCEDURE doRexx(txt: e.ADDRESS; modifier: SHORTSET;
  96.                  type: INTEGER;
  97.                  port: ARRAY OF CHAR;
  98.                  arg0, arg1: LONGINT); (* demo cmds have only 1 arg! *)
  99. VAR
  100.   rxMsg,cmdMsg: arx.RexxMsgPtr;
  101.   ARexxPort: e.MsgPortPtr;
  102. BEGIN
  103.   rxMsg := arx.CreateRexxMsg(sys.ADR(MyPort),NIL,sys.ADR(ApplDemo));
  104.   IF rxMsg#NIL THEN
  105.  
  106.     (* okay, jetzt können wir die Felder füllen *)
  107.  
  108.     rxMsg.action.command := arx.comm;  (* msg ist Command *)
  109.     rxMsg.action.modifier := modifier; (* paramter! *)
  110.     rxMsg.args[0] := arg0; (* command to be executed *)
  111.     rxMsg.args[1] := arg1; (* argument for that command *)
  112.     rxMsg.args[eAD.TextSlot] := txt; (* Text for witch the Msg is *)
  113.     IF type = 0 THEN
  114.       rxMsg.node.node.name := eAD.idAEd0; (* ID for Msg-Type *)
  115.     ELSE
  116.       rxMsg.node.node.name := eAD.idAEd1; (* ID for Msg-Type *)
  117.     END;
  118.  
  119.     e.Forbid;
  120.     ARexxPort := e.FindPort(port); (* Port suchen *)
  121.     IF ARexxPort#NIL THEN
  122.       e.PutMsg(ARexxPort,rxMsg); (* msg schicken *)
  123.       e.Permit;
  124.  
  125.       LOOP
  126.         e.WaitPort(sys.ADR(MyPort));
  127.         cmdMsg := e.GetMsg(sys.ADR(MyPort));
  128.         WHILE cmdMsg # NIL DO
  129.           io.WriteString("Results:");
  130.           io.WriteInt(cmdMsg.result1,4); (* results ausgeben *)
  131.           io.WriteInt(cmdMsg.result2,4);
  132.           io.WriteLn;
  133.  
  134.           IF rxMsg = cmdMsg THEN (* eigene Msg zurück -> fertig *)
  135.             EXIT; END;
  136.           e.ReplyMsg(cmdMsg); (* ansonsten unbearbeitet zurück *)
  137.           cmdMsg := e.GetMsg(sys.ADR(MyPort));
  138.         END;
  139.       END; (* LOOP *)
  140.  
  141.     ELSE; (* IF ARexxPort#NIL *)
  142.       e.Permit;
  143.       io.WriteString("Port not found!!\n"); HALT(20);
  144.     END;
  145.     arx.DeleteRexxMsg(rxMsg);
  146.   ELSE
  147.     io.WriteString("CreateRexxMsg failed\n");
  148.     HALT(20);
  149.   END;
  150. END doRexx;
  151.  
  152.  
  153. PROCEDURE NewHost(name: StringPtr): BOOLEAN;
  154. VAR
  155.   host: HostPtr;
  156.   len: INTEGER;
  157. BEGIN
  158.   NEW(host);
  159.   IF host # NIL THEN
  160.     len := str.Length(name^)+1;
  161.     ol.New(host.name,len);
  162.     IF host.name # NIL THEN
  163.       e.CopyMem(name^,host.name^,len);
  164.       lst.AddTail(HostList,host);
  165.       RETURN TRUE;
  166.     END;
  167.     DISPOSE(host);
  168.   END;
  169.   RETURN FALSE;
  170. END NewHost;
  171.  
  172.  
  173. PROCEDURE Start;
  174. VAR
  175.   rxArg: StringPtr;
  176. BEGIN
  177.   (*
  178.    * Hier wäre es sinnvoll, zu testen, ob die gleiche Applikation schon
  179.    * läuft. Wenn ja, bekommt diese eine Msg zu schicken, in der mitgeteilt
  180.    * wird, sie soll auf noch einen Port reagieren, uns wir brechen ab.
  181.    * In solch einem Fall müßen Öffnen und Schließen mitgezählt werden!
  182.    *)
  183.   (* Initialize our message port *)
  184.   IF arx.InitPort(sys.ADR(MyPort),sys.ADR(ApplDemo)) = -1 THEN
  185.     io.WriteString("Can't InitPort\n");
  186.     HALT(20);
  187.   END;
  188.   (* same PortName exists? => same Appl *)
  189.   e.Forbid();
  190.   IF e.FindPort(ApplDemo) # NIL THEN
  191.     doRexx(NIL,SHORTSET{},1,ApplDemo,sys.ADR(NewText),sys.ADR(HisPortName));
  192.     (* e.Permid(); nicht nötig, wg. e.WaitPort() in doRexx *)
  193.     (*
  194.      * eben nicht, wiel monentan die andere abbricht!!
  195.      *
  196.     HALT(0);
  197.     *)
  198.     WHILE e.FindPort(ApplDemo) # NIL DO
  199.       d.Delay(100); END;
  200.  
  201.   END;
  202.  
  203.   PortAdded := TRUE;
  204.   e.AddPort(sys.ADR(MyPort)); (* Make the port public *)
  205.  
  206.   lst.Init(HostList);
  207.   IF NOT NewHost(sys.ADR(HisPortName)) THEN
  208.     io.WriteString("No memory!\n");
  209.     HALT(20);
  210.   END;
  211.  
  212.   (*
  213.    *  Appl-Anmeldung an AmokEd schicken
  214.    *
  215.    *  Bsp. für Typ AEd0 (ein StringPtr in args[0])
  216.    *  Der String wird geparset, darum brauchen wir einen Argstring
  217.    *
  218.    *  AEd kenn uns noch nicht, daher der FindPort()
  219.    *)
  220.   rxArg := arx.CreateArgstring(sys.ADR(Announce),sys.SIZE(Announce));
  221.   IF rxArg = NIL THEN
  222.     io.WriteString(CantCreateArgstring);
  223.     HALT(20);
  224.   END;
  225.  
  226.   e.Forbid();
  227.   IF e.FindPort(HisPortName) # NIL THEN
  228.     doRexx(NIL,SHORTSET{},0,HisPortName,rxArg,0);
  229.     (* e.Permid(); nicht nötig, wg. e.WaitPort() in doRexx *)
  230.     arx.DeleteArgstring(rxArg);
  231.   ELSE
  232.     e.Permit();
  233.     arx.DeleteArgstring(rxArg);
  234.     io.WriteString("Port not found!!\n");
  235.     HALT(20);
  236.   END;
  237.  
  238.   ol.MemReqs := LONGSET{e.public};
  239.   NEW(PingPongField);
  240.   IF PingPongField = NIL THEN
  241.     io.WriteString("No Memory!");
  242.     HALT(20);
  243.   END;
  244.  
  245.   pingnum := eAD.NumExtPingPong;
  246.   REPEAT
  247.     DEC(pingnum);
  248.     PingPongField[pingnum].line := -1;
  249.   UNTIL pingnum = 0;
  250.  
  251.   PingPongField[0].line := 2; PingPongField[0].pos := 0;
  252.   PingPongField[1].line := 4; PingPongField[1].pos := 4;
  253.   PingPongField[2].line := 4; PingPongField[2].pos := 20;
  254.   PingPongField[3].line := 7; PingPongField[3].pos := 13;
  255.   PingPongField[4].line := 9; PingPongField[4].pos := 13;
  256. END Start;
  257.  
  258.  
  259. PROCEDURE CloseDown;
  260. VAR
  261.   n, s: e.MessagePtr;
  262. BEGIN
  263.   io.WriteString("Closing\n");
  264.   IF PortAdded THEN
  265.     e.RemPort(sys.ADR(MyPort));
  266.   END;
  267.   (*
  268.   e.Forbid();
  269.   n := MyPort.msgList.head;
  270.   WHILE n.node.succ # NIL DO
  271.     s := n.node.succ;
  272.     IF n.replyPort # sys.ADR(MyPort) THEN
  273.       e.Remove(n);
  274.       e.ReplyMsg(n);
  275.     END;
  276.     n := s;
  277.   END;
  278.   e.Permit;
  279.   *)
  280.   arx.FreePort(sys.ADR(MyPort));
  281. END CloseDown;
  282.  
  283. (*
  284. PROCEDURE TestArgs;
  285. VAR
  286.   args: INTEGER;
  287.   b: String;
  288. BEGIN
  289.   args := arg.NumArgs();
  290.   io.WriteInt(args,4);
  291.   WHILE args > 0 DO
  292.     arg.GetArg(args,b);
  293.     io.WriteString(b); io.WriteLn;
  294.     DEC(args);
  295.   END;
  296. END TestArgs;
  297. *)
  298.  
  299. BEGIN
  300.   (* Will genau passende Anzahl Parameter *)
  301.   IF arg.NumArgs() # eAD.numNotifyArgsAEd1 THEN
  302.     io.WriteString("Bad Args\n");
  303.     HALT(20);
  304.   END;
  305.   arg.GetArg(1,HisPortName);  (* Der Name des ZielPorts *)
  306.   Start;
  307.   io.WriteString("started\n");
  308.  
  309.   LOOP
  310.     e.WaitPort(sys.ADR(MyPort));
  311.     rmptr := e.GetMsg(sys.ADR(MyPort));
  312.  
  313.     IF arx.IsRexxMsg(rmptr) THEN
  314.       e.ReplyMsg(rmptr);
  315.       EXIT;
  316.     ELSIF (rmptr.node.node.name=eAD.idAEd0)
  317.     OR (rmptr.node.node.name=eAD.idAEd1) THEN
  318.       (*
  319.        * AmokEd sendet nur Typ AEd0, aber ApplDemo schickt AEd1
  320.        *)
  321.  
  322.       rmptr.result1 := 0;
  323.       rmptr.result2 := NIL;
  324.  
  325.       IF (rmptr.action.command = arx.close) THEN
  326.         e.ReplyMsg(rmptr);
  327.         EXIT;
  328.       END;
  329.  
  330.       IF rmptr.args[0] = NIL THEN
  331.         rmptr.result1 := 10;
  332.         rmptr.result2 := NIL;
  333.       ELSE
  334.         string := rmptr.args[0];
  335.  
  336.         (*
  337.          *  Die Strings werden nicht geparset, darum brauchen wir auch
  338.          *  keinen Argstring
  339.          *)
  340.         IF str.NCStrCmp(string^,"PINGPING") = 0 THEN
  341.           doRexx(rmptr.args[eAD.TextSlot],SHORTSET{},1,HisPortName,
  342.                  sys.ADR("XPING"),PingPongField);
  343.         ELSIF str.NCStrCmp(string^,"NEXTPING") = 0 THEN
  344.           doRexx(rmptr.args[eAD.TextSlot],SHORTSET{},1,HisPortName,
  345.                  sys.ADR("XPONG"),pingnum);
  346.           INC(pingnum);
  347.           IF pingnum = numActivePings THEN pingnum := 0; END;
  348.         ELSIF string^ = NewText THEN
  349.           HALT(5);
  350.           (*
  351.            * irgendwie so, ich hab aber keine Lust mehr, das
  352.            * jetzt in alle Einzelhaiten zu programmieren
  353.            *
  354.           IF NOT NewHost(rmptr.args[1]) THEN
  355.             rmptr.result1 := edE.cmdSevere;
  356.             rmptr.result2 := edE.NoMemory;
  357.           END;
  358.           *)
  359.         ELSE
  360.           doRexx(rmptr.args[eAD.TextSlot],SHORTSET{},1,HisPortName,
  361.                  sys.ADR("title"),rmptr.args[0]);
  362.           (* an AmokEd schicken *)
  363.         END;
  364.       END;
  365.     END;
  366.     e.ReplyMsg(rmptr);
  367.   END; (* LOOP *)
  368.  
  369. CLOSE
  370.   CloseDown;
  371. END ApplDemo.
  372.  
  373.